package com.itany.cloud.service;

import com.itany.cloud.util.ResponseResult;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.*;

/**
 * Author:shixiaojun@itany.com
 * Date: 2022/3/22 9:06
 * Version: 1.0-SNAPSHOT
 */
@Service
// 通过FeignClient指定当前服务所订阅的微服务是谁
// 此处指定的微服务值表示的是对应的微服务所在的服务器的协议名://域名:端口
// 此处调用的为cloud-eureka-provider,相当于访问了http://localhost:8001
// 该微服务中的具体资源的访问需要在方法中进行调用
//@FeignClient(value = "cloud-eureka-provider")
//@FeignClient(value = "cloud-eureka-provider",fallback = UserServiceFallback.class)
//@FeignClient(value = "cloud-zuul",fallback = UserServiceFallback.class)
@FeignClient(value = "cloud-zuul")
public interface UserService {

    // 在接口中定义对应的方法
    // 每一个资源的调用均对应一个方法
    // 此处想要调用具体的资源,使用的是Handler中提供的注解
    // 且一切Handler中默认行为,在此处均失效
    // 在当前service中使用Handler提供的注解进行请求的调用时,没有任何默认行为

    // 此处的RequestMapper相关注解并不是指定访问命令
    // 而是访问指定的命令
    // 最终访问的资源命令为:接口上指定的微服务+方法上指定的资源地址
//    @GetMapping("/users")
    @GetMapping("/v1/userService/users")
    public ResponseResult findAll();

    // 由于此处没有任何默认行为,因此,注解@PathVariable("key")中的参数key不能省略
//    @GetMapping("/users/{id}")
    @GetMapping("/v1/userService/users/{id}")
    public ResponseResult findById(@PathVariable("id") Integer id);

    // 由于此处没有任何默认行为,因此如果参数是对应,不会自动适配对象中的参数属性
    // 即:此处的参数不能是对象
    // 且每一个参数对应的注解@RequestParam("key")也不能省略
//    @PostMapping("/users")
    @PostMapping("/v1/userService/users")
    public ResponseResult addUser(@RequestParam("username") String username,@RequestParam("password") String password,@RequestParam("phone") String phone,@RequestParam("address") String address);

//    @DeleteMapping("/users/{id}")
    @DeleteMapping("/v1/userService/users/{id}")
    public ResponseResult deleteUser(@PathVariable("id") Integer id);

//    @PutMapping("/users")
    @PutMapping("/v1/userService/users")
    public ResponseResult modifyUser(@RequestParam("id") Integer id, @RequestParam("username") String username,@RequestParam("password") String password,@RequestParam("phone") String phone,@RequestParam("address") String address);
//    public ResponseResult modifyUser(@RequestParam Map<String,Object> map);

}
